package com.sun.forumautotest.common;

/**
 * @Author sun
 */

import io.github.bonigarcia.wdm.WebDriverManager;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;

// 常用方法
public class AutoTestUtil {

    public static ChromeDriver driver = null;

    // 创建谷歌驱动对象
    public static ChromeDriver createDriverUtil() {

        // 驱动打开谷歌浏览器
        WebDriverManager.chromedriver().setup();
        // 配置安全策略
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");

        // 无头模式, 可以后台执行, 观察效果就关闭
//        options.addArguments("--headless=new");

        // 将配置添加到浏览器对象中
        if (driver == null) {
            driver = new ChromeDriver(options);
        }

        // 添加 隐式等待 确保页面元素渲染出来
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        return driver;
    }


    // 屏幕截图: 文件名带有类名和方法名
    public static void getScreenshotAs(String classMethodName) throws IOException {

        // 1. 用一个单独文件夹存放截图文件
        // 2. 出问题能够快速定位到(方便查找, 见名知意)
        SimpleDateFormat ymd = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat hms = new SimpleDateFormat("HH_mm_ss_SS");  // HH:mm:ss 文件名字不能带有 :, 所以使用 _

        String currentYMD = ymd.format(System.currentTimeMillis());
        String currentHMS = hms.format(System.currentTimeMillis());
        // 截图存储的路径
        String filePath = "./src/test/image/" + currentYMD + "/" + classMethodName + "_" +currentHMS + ".png";

        // 截图
        File screenshotAs = ( (TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        File destFile = new File(filePath);

        // 保存到指定目录
        FileUtils.copyFile(screenshotAs, destFile);

    }

    // 获取调用者方法名
    public static String currentMethodName() {
        // 通过跟踪堆栈信息获取方法名
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        // 索引选择规则：
        // stackTrace[0] -> getStackTrace() 方法本身
        // stackTrace[1] -> 当前方法（currentMethodName）
        // stackTrace[2] -> 调用者方法（比如main）
        return stackTrace[2].getMethodName();

    }

}